package com.xiaomi.infra.chronos.client; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Properties; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.zookeeper.ZKConfig; import org.apache.thrift.transport.TTransportException; import org.apache.zookeeper.KeeperException; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.xiaomi.infra.chronos.client.ChronosClientWatcher; import com.xiaomi.infra.chronos.ChronosServer; import com.xiaomi.infra.chronos.ChronosServerWatcher; import com.xiaomi.infra.chronos.exception.ChronosException; import com.xiaomi.infra.chronos.zookeeper.HostPort; import com.xiaomi.infra.chronos.zookeeper.ZooKeeperUtil; /** * Test {@link ChronosClientWatcher} * * Pass with thrift-0.8.0, but not pass with thrift-0.5.0 because the class of server is not found. */ public class TestChronosClientWatcher { private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(new Configuration()); @BeforeClass public static void setUpBeforeClass() throws Exception { TEST_UTIL.startMiniZKCluster(1); } @AfterClass public static void tearDownAfterClass() throws Exception { TEST_UTIL.shutdownMiniZKCluster(); } @Before public void resetZooKeeper() throws IOException, KeeperException, TTransportException, ChronosException { ChronosServer chronosServer = createChronosServer(new HostPort("127.0.0.1", 10086)); ZooKeeperUtil.deleteNodeRecursively(chronosServer.getFailoverWatcher(), chronosServer .getFailoverWatcher().getBaseZnode()); chronosServer.getFailoverWatcher().close(); } private ChronosClientWatcher createChronosClientWatcher() throws IOException { Properties properties = new Properties(); properties.setProperty(ChronosClient.ZK_QUORUM, ZKConfig.getZKQuorumServersString(TEST_UTIL.getConfiguration())); properties.setProperty(ChronosClient.SESSION_TIMEOUT, String.valueOf(3000)); properties.setProperty(ChronosClient.CONNECT_RETRY_TIMES, String.valueOf(10)); return new ChronosClientWatcher(properties); } public ChronosServer createChronosServer(HostPort hostPort) throws IOException, TTransportException, ChronosException { Properties properties = new Properties(); properties.setProperty(ChronosServer.SERVER_HOST, hostPort.getHost()); properties.setProperty(ChronosServer.SERVER_PORT, String.valueOf(hostPort.getPort())); properties.setProperty(ChronosServer.BASE_ZNODE, "/chronos/default-cluster"); properties.setProperty(ChronosServer.ZK_QUORUM, ZKConfig.getZKQuorumServersString(TEST_UTIL.getConfiguration())); properties.setProperty(ChronosServer.SESSION_TIMEOUT, String.valueOf(3000)); properties.setProperty(ChronosServer.MAX_THREAD, "100000"); properties.setProperty(ChronosServer.ZK_ADVANCE_TIMESTAMP, "100000"); properties.setProperty(ChronosServer.CONNECT_RETRY_TIMES, String.valueOf(10)); return new ChronosServer(new ChronosServerWatcher(properties)); } @Test public void testGetTimestamp() throws IOException, InterruptedException, TTransportException, ChronosException { final ChronosServer chronosServer = createChronosServer(new HostPort("127.0.0.1", 2187)); Thread thread = new Thread() { @Override public void run() { chronosServer.run(); } }; thread.start(); Thread.sleep(500); // wait for server to start ChronosClientWatcher chronosClientWatcher = createChronosClientWatcher(); chronosClientWatcher.getTimestamp(); chronosServer.stopThriftServer(); chronosServer.getFailoverWatcher().close(); chronosClientWatcher.close(); assertTrue(true); } }